#ifndef _DRIVE_H_
#define _DRIVE_H_
#include "config.h"
#include "mcu_regs.h"
#include "efr.h"
#include "types.h"

#ifndef CONFIG_USING_SI2C
#define CONFIG_USING_SI2C                          (NULL)
#endif
#ifndef CONFIG_IC_TYPE
#define CONFIG_IC_TYPE                             (CHIP_SS881X)
#endif
#ifndef CONFIG_MODE
#define CONFIG_MODE                                (NULL)
#endif
#ifndef CONFIG_USING_DEBUG
#define CONFIG_USING_DEBUG                         (NULL)
#endif
#ifndef CONFIG_USING_CHARGER
#define CONFIG_USING_CHARGER                       (NULL)
#endif
#ifndef CONFIG_BAT_FULL_VOLTAGE
#define CONFIG_BAT_FULL_VOLTAGE                    (4200)
#endif
#ifndef CONFIG_DC_CHARGER_MAX_CURRENT
#define CONFIG_DC_CHARGER_MAX_CURRENT              (400)
#endif

#ifndef GPIO_P00_MODE
#define GPIO_P00_MODE                              (GPIO_MODE_INPUT)
#endif
#ifndef GPIO_P01_MODE
#define GPIO_P01_MODE                              (GPIO_MODE_INPUT)
#endif
#ifndef GPIO_P02_MODE
#define GPIO_P02_MODE                              (GPIO_MODE_INPUT)
#endif
#ifndef GPIO_P03_MODE
#define GPIO_P03_MODE                              (GPIO_MODE_INPUT)
#endif
#ifndef GPIO_P04_MODE
#define GPIO_P04_MODE                              (GPIO_MODE_INPUT)
#endif
#ifndef GPIO_P05_MODE
#define GPIO_P05_MODE                              (GPIO_MODE_INPUT)
#endif
#ifndef GPIO_P06_MODE
#define GPIO_P06_MODE                              (GPIO_MODE_INPUT)
#endif
#ifndef GPIO_P07_MODE
#define GPIO_P07_MODE                              (GPIO_MODE_INPUT)
#endif
#ifndef GPIO_P10_MODE
#define GPIO_P10_MODE                              (GPIO_MODE_INPUT)
#endif
#ifndef GPIO_P11_MODE
#define GPIO_P11_MODE                              (GPIO_MODE_INPUT)
#endif
#ifndef GPIO_P12_MODE
#define GPIO_P12_MODE                              (GPIO_MODE_INPUT)
#endif
#ifndef GPIO_P13_MODE
#define GPIO_P13_MODE                              (GPIO_MODE_INPUT)
#endif
#ifndef GPIO_P14_MODE
#define GPIO_P14_MODE                              (GPIO_MODE_INPUT)
#endif
#ifndef GPIO_P15_MODE
#define GPIO_P15_MODE                              (GPIO_MODE_INPUT)
#endif
#ifndef GPIO_P16_MODE
#define GPIO_P16_MODE                              (GPIO_MODE_INPUT)
#endif
#ifndef GPIO_P17_MODE
#define GPIO_P17_MODE                              (GPIO_MODE_INPUT)
#endif
#ifndef GPIO_P20_MODE
#define GPIO_P20_MODE                              (GPIO_MODE_INPUT)
#endif
#ifndef GPIO_P21_MODE
#define GPIO_P21_MODE                              (GPIO_MODE_INPUT)
#endif
#ifndef GPIO_P22_MODE
#define GPIO_P22_MODE                              (GPIO_MODE_INPUT)
#endif
#ifndef GPIO_P23_MODE
#define GPIO_P23_MODE                              (GPIO_MODE_INPUT)
#endif
#ifndef GPIO_P24_MODE
#define GPIO_P24_MODE                              (GPIO_MODE_INPUT)
#endif
#ifndef GPIO_P25_MODE
#define GPIO_P25_MODE                              (GPIO_MODE_INPUT)
#endif
#ifndef GPIO_P26_MODE
#define GPIO_P26_MODE                              (GPIO_MODE_INPUT)
#endif
#ifndef GPIO_P27_MODE
#define GPIO_P27_MODE                              (GPIO_MODE_INPUT)
#endif
#ifndef GPIO_P30_MODE
#define GPIO_P30_MODE                              (GPIO_MODE_INPUT)
#endif

#ifndef GPIO_P00_PULL
#define GPIO_P00_PULL                              (GPIO_NOPULL)
#endif
#ifndef GPIO_P01_PULL
#define GPIO_P01_PULL                              (GPIO_NOPULL)
#endif
#ifndef GPIO_P02_PULL
#define GPIO_P02_PULL                              (GPIO_NOPULL)
#endif
#ifndef GPIO_P03_PULL
#define GPIO_P03_PULL                              (GPIO_NOPULL)
#endif
#ifndef GPIO_P04_PULL
#define GPIO_P04_PULL                              (GPIO_NOPULL)
#endif
#ifndef GPIO_P05_PULL
#define GPIO_P05_PULL                              (GPIO_NOPULL)
#endif
#ifndef GPIO_P06_PULL
#define GPIO_P06_PULL                              (GPIO_NOPULL)
#endif
#ifndef GPIO_P07_PULL
#define GPIO_P07_PULL                              (GPIO_NOPULL)
#endif
#ifndef GPIO_P10_PULL
#define GPIO_P10_PULL                              (GPIO_NOPULL)
#endif
#ifndef GPIO_P11_PULL
#define GPIO_P11_PULL                              (GPIO_NOPULL)
#endif
#ifndef GPIO_P12_PULL
#define GPIO_P12_PULL                              (GPIO_NOPULL)
#endif
#ifndef GPIO_P13_PULL
#define GPIO_P13_PULL                              (GPIO_NOPULL)
#endif
#ifndef GPIO_P14_PULL
#define GPIO_P14_PULL                              (GPIO_NOPULL)
#endif
#ifndef GPIO_P15_PULL
#define GPIO_P15_PULL                              (GPIO_NOPULL)
#endif
#ifndef GPIO_P16_PULL
#define GPIO_P16_PULL                              (GPIO_NOPULL)
#endif
#ifndef GPIO_P17_PULL
#define GPIO_P17_PULL                              (GPIO_NOPULL)
#endif
#ifndef GPIO_P20_PULL
#define GPIO_P20_PULL                              (GPIO_NOPULL)
#endif
#ifndef GPIO_P21_PULL
#define GPIO_P21_PULL                              (GPIO_NOPULL)
#endif
#ifndef GPIO_P22_PULL
#define GPIO_P22_PULL                              (GPIO_NOPULL)
#endif
#ifndef GPIO_P23_PULL
#define GPIO_P23_PULL                              (GPIO_NOPULL)
#endif
#ifndef GPIO_P24_PULL
#define GPIO_P24_PULL                              (GPIO_NOPULL)
#endif
#ifndef GPIO_P25_PULL
#define GPIO_P25_PULL                              (GPIO_NOPULL)
#endif
#ifndef GPIO_P26_PULL
#define GPIO_P26_PULL                              (GPIO_NOPULL)
#endif
#ifndef GPIO_P27_PULL
#define GPIO_P27_PULL                              (GPIO_NOPULL)
#endif
#ifndef GPIO_P30_PULL
#define GPIO_P30_PULL                              (GPIO_NOPULL)
#endif

#if (GPIO_P00_MODE == GPIO_MODE_OUTPUT)
    #define GPIO_P00_IO_MODE                       (GPIO_0_OUTPUT)  /* Pin 00 intput    */
#elif (GPIO_P00_MODE == GPIO_MODE_INPUT)
    #define GPIO_P00_IO_MODE                       (GPIO_0_INPUT)  /* Pin 00 output    */
#elif (GPIO_P00_MODE == GPIO_MODE_PWM)
    #define GPIO_P00_PWM_MODE                      (PWM0)          /* Pin 00 PWM    */
#elif (GPIO_P00_MODE == GPIO_MODE_CMP)
    #define GPIO_P00_CMP_MODE                      (CMP0)          /* Pin 00 CMP    */
#else
    #error("The I/O configuration does not exist")
#endif

#if (GPIO_P01_MODE == GPIO_MODE_OUTPUT)
    #define GPIO_P01_IO_MODE                       (GPIO_1_OUTPUT)  /* Pin 01 intput    */
#elif (GPIO_P01_MODE == GPIO_MODE_INPUT)
    #define GPIO_P01_IO_MODE                       (GPIO_1_INPUT)   /* Pin 01 output    */
#elif (GPIO_P01_MODE == GPIO_MODE_PWM)
    #define GPIO_P01_PWM_MODE                      (PWM1)           /* Pin 01 PWM    */
#elif (GPIO_P01_MODE == GPIO_MODE_ADC)
    #define GPIO_P01_ADC_MODE                      (AN3)            /* Pin 01 ADC    */
#elif (GPIO_P01_MODE == GPIO_MODE_TX0)
    #define GPIO_P01_UART_MODE                     (TX0)            /* Pin 01 TX0    */
#elif (GPIO_P01_MODE == GPIO_MODE_NTC)
    #define GPIO_P01_NTC_MODE                      (NTC)            /* Pin 01 NTC1    */
#else
    #error("The I/O configuration does not exist")
#endif

#if (GPIO_P02_MODE == GPIO_MODE_OUTPUT)
    #define GPIO_P02_IO_MODE                       (GPIO_2_OUTPUT)  /* Pin 02 intput    */
#elif (GPIO_P02_MODE == GPIO_MODE_INPUT)
    #define GPIO_P02_IO_MODE                       (GPIO_2_INPUT)   /* Pin 02 output    */
#elif (GPIO_P02_MODE == GPIO_MODE_ADC)
    #define GPIO_P02_ADC_MODE                      (AN7)            /* Pin 02 ADC    */
#elif (GPIO_P02_MODE == GPIO_MODE_CC)
    #define GPIO_P02_CC_MODE                       (CC0)            /* Pin 02 CC    */
#else
    #error("The I/O configuration does not exist")
#endif

#if (GPIO_P03_MODE == GPIO_MODE_OUTPUT)
    #define GPIO_P03_IO_MODE                       (GPIO_3_OUTPUT)  /* Pin 03 intput    */
#elif (GPIO_P03_MODE == GPIO_MODE_INPUT)
    #define GPIO_P03_IO_MODE                       (GPIO_3_INPUT)   /* Pin 03 output    */
#elif (GPIO_P03_MODE == GPIO_MODE_ADC)
    #define GPIO_P03_ADC_MODE                      (AN2)            /* Pin 03 ADC    */
#elif (GPIO_P03_MODE == GPIO_MODE_NTC)
    #define GPIO_P03_NTC_MODE                      (NTC)            /* Pin 03 NTC    */
#elif (GPIO_P03_MODE == GPIO_MODE_EINT)
    #define GPIO_P03_EINT_MODE                     (EINT1)          /* Pin 03 EINT1    */
#else
    #error("The I/O configuration does not exist")
#endif

#if (GPIO_P04_MODE == GPIO_MODE_OUTPUT)
    #define GPIO_P04_IO_MODE                       (GPIO_4_OUTPUT)  /* Pin 04 intput    */
#elif (GPIO_P04_MODE == GPIO_MODE_INPUT)
    #define GPIO_P04_IO_MODE                       (GPIO_4_INPUT)   /* Pin 04 output    */
#elif (GPIO_P04_MODE == GPIO_MODE_CMP)
    #define GPIO_P04_CMP_MODE                      (CMP0)           /* Pin 04 CMP    */
#elif (GPIO_P04_MODE == GPIO_MODE_CC)
    #define GPIO_P04_CC_MODE                       (CC0)            /* Pin 04 CC    */
#elif (GPIO_P04_MODE == GPIO_MODE_EINT)
    #define GPIO_P04_EINT_MODE                     (EINT0)          /* Pin 04 EINT0    */
#elif (GPIO_P04_MODE == GPIO_MODE_SPI)
    #define GPIO_P04_SPI_MODE                      (SPI_SS)          /* Pin 04 SPI_SS    */
#else
    #error("The I/O configuration does not exist")
#endif

#if (GPIO_P05_MODE == GPIO_MODE_OUTPUT)
    #define GPIO_P05_IO_MODE                       (GPIO_5_OUTPUT)  /* Pin 05 intput    */
#elif (GPIO_P05_MODE == GPIO_MODE_INPUT)
    #define GPIO_P05_IO_MODE                       (GPIO_5_INPUT)   /* Pin 05 output    */
#elif (GPIO_P05_MODE == GPIO_MODE_CC)
    #define GPIO_P05_CC_MODE                       (CC1)            /* Pin 05 CC    */
#else
    #error("The I/O configuration does not exist")
#endif

#if (GPIO_P06_MODE == GPIO_MODE_OUTPUT)
    #define GPIO_P06_IO_MODE                       (GPIO_6_OUTPUT)  /* Pin 06 intput    */
#elif (GPIO_P06_MODE == GPIO_MODE_INPUT)
    #define GPIO_P06_IO_MODE                       (GPIO_6_INPUT)   /* Pin 06 output    */
#elif (GPIO_P06_MODE == GPIO_MODE_ADC)
    #define GPIO_P06_ADC_MODE                      (AN4)            /* Pin 06 ADC    */
#elif (GPIO_P06_MODE == GPIO_MODE_CC)
    #define GPIO_P06_CC_MODE                       (CC2)            /* Pin 06 CC    */
#elif (GPIO_P06_MODE == GPIO_MODE_TX0)
    #define GPIO_P06_UART_MODE                     (TX0)            /* Pin 06 UART TX0    */
#elif (GPIO_P06_MODE == GPIO_MODE_RX0)
    #define GPIO_P06_UART_MODE                     (RX0)            /* Pin 06 UART RX0    */
#elif (GPIO_P06_MODE == GPIO_MODE_MT0)
    #define GPIO_P06_UART_MODE                     (MT0)            /* Pin 06 UART TX0/RX0 MULT    */
#else
    #error("The I/O configuration does not exist")
#endif

#if (GPIO_P07_MODE == GPIO_MODE_OUTPUT)
    #define GPIO_P07_IO_MODE                       (GPIO_7_OUTPUT)  /* Pin 07 intput    */
#elif (GPIO_P07_MODE == GPIO_MODE_INPUT)
    #define GPIO_P07_IO_MODE                       (GPIO_7_INPUT)   /* Pin 07 output    */
#elif (GPIO_P07_MODE == GPIO_MODE_CC)
    #define GPIO_P07_CC_MODE                       (CC3)            /* Pin 07 CC    */
#elif (GPIO_P07_MODE == GPIO_MODE_PFO)
    #define GPIO_P07_PFO_MODE                      (PFO)            /* Pin 07 PFO    */
#else
    #error("The I/O configuration does not exist")
#endif

#if (GPIO_P10_MODE == GPIO_MODE_OUTPUT)
    #define GPIO_P10_IO_MODE                       (GPIO_0_OUTPUT)  /* Pin 10 intput    */
#elif (GPIO_P10_MODE == GPIO_MODE_INPUT)
    #define GPIO_P10_IO_MODE                       (GPIO_0_INPUT)   /* Pin 10 output    */
#elif (GPIO_P10_MODE == GPIO_MODE_TS)
    #define GPIO_P10_TS_MODE                       (TS1)            /* Pin 10 touch source    */
#elif (GPIO_P10_MODE == GPIO_MODE_CC)
    #define GPIO_P10_CC_MODE                       (CC1)            /* Pin 10 CC    */
#elif (GPIO_P10_MODE == GPIO_MODE_EINT)
    #define GPIO_P10_EINT_MODE                     (EINT0)          /* Pin 10 EINT0    */
#else
    #error("The I/O configuration does not exist")
#endif

#if (GPIO_P11_MODE == GPIO_MODE_OUTPUT)
    #define GPIO_P11_IO_MODE                       (GPIO_1_OUTPUT)  /* Pin 11 intput    */
#elif (GPIO_P11_MODE == GPIO_MODE_INPUT)
    #define GPIO_P11_IO_MODE                       (GPIO_1_INPUT)   /* Pin 11 output    */
#elif (GPIO_P11_MODE == GPIO_MODE_ADC)
    #define GPIO_P11_ADC_MODE                      (AN5)            /* Pin 11 ADC    */
#elif (GPIO_P11_MODE == GPIO_MODE_TX0)
    #define GPIO_P11_UART_MODE                     (TX0)            /* Pin 11 UART TX0    */
#elif (GPIO_P11_MODE == GPIO_MODE_RX0)
    #define GPIO_P11_UART_MODE                     (RX0)            /* Pin 11 UART RX0    */
#elif (GPIO_P11_MODE == GPIO_MODE_MT0)
    #define GPIO_P11_UART_MODE                     (MT0)            /* Pin 11 UART TX0/RX0 MULT    */
#else
    #error("The I/O configuration does not exist")
#endif

#if (GPIO_P12_MODE == GPIO_MODE_OUTPUT)
    #define GPIO_P12_IO_MODE                       (GPIO_2_OUTPUT)  /* Pin 12 intput    */
#elif (GPIO_P12_MODE == GPIO_MODE_INPUT)
    #define GPIO_P12_IO_MODE                       (GPIO_2_INPUT)   /* Pin 12 output    */
#elif (GPIO_P12_MODE == GPIO_MODE_TS)
    #define GPIO_P12_TS_MODE                       (TS0)            /* Pin 12 touch source    */
#elif (GPIO_P12_MODE == GPIO_MODE_RX0)
    #define GPIO_P12_UART_MODE                     (RX0)           /* Pin 12 UART RX0    */
#else
    #error("The I/O configuration does not exist")
#endif

#if (GPIO_P13_MODE == GPIO_MODE_OUTPUT)
    #define GPIO_P13_IO_MODE                       (GPIO_3_OUTPUT)  /* Pin 13 intput    */
#elif (GPIO_P13_MODE == GPIO_MODE_INPUT)
    #define GPIO_P13_IO_MODE                       (GPIO_3_INPUT)   /* Pin 13 output    */
#elif (GPIO_P13_MODE == GPIO_MODE_PWM)
    #define GPIO_P13_PWM_MODE                      (PWM1)            /* Pin 13 PWM    */
#else
    #error("The I/O configuration does not exist")
#endif

#if (GPIO_P14_MODE == GPIO_MODE_OUTPUT)
    #define GPIO_P14_IO_MODE                       (GPIO_4_OUTPUT)  /* Pin 14 intput    */
#elif (GPIO_P14_MODE == GPIO_MODE_INPUT)
    #define GPIO_P14_IO_MODE                       (GPIO_4_INPUT)   /* Pin 14 output    */
#elif (GPIO_P14_MODE == GPIO_MODE_TS)
    #define GPIO_P14_TS_MODE                       (TS2)            /* Pin 14 touch source    */
#elif (GPIO_P14_MODE == GPIO_MODE_CC)
    #define GPIO_P14_CC_MODE                       (CC2)            /* Pin 14 CC    */
#elif (GPIO_P14_MODE == GPIO_MODE_EINT)
    #define GPIO_P14_EINT_MODE                     (EINT1)          /* Pin 14 EINT1    */
#elif (GPIO_P14_MODE == GPIO_MODE_SPI)
    #define GPIO_P14_SPI_MODE                      (SPI_SCK)        /* Pin 14 SPI_SCK    */
#else
    #error("The I/O configuration does not exist")
#endif

#if (GPIO_P15_MODE == GPIO_MODE_OUTPUT)
    #define GPIO_P15_IO_MODE                       (GPIO_5_OUTPUT)  /* Pin 15 intput    */
#elif (GPIO_P15_MODE == GPIO_MODE_INPUT)
    #define GPIO_P15_IO_MODE                       (GPIO_5_INPUT)   /* Pin 15 output    */
#elif (GPIO_P15_MODE == GPIO_MODE_CC)
    #define GPIO_P15_CC_MODE                       (CC2)            /* Pin 15 CC    */
#elif (GPIO_P15_MODE == GPIO_MODE_TS)
    #define GPIO_P15_TS_MODE                       (TS3)            /* Pin 14 touch source    */
#else
    #error("The I/O configuration does not exist")
#endif

#if (GPIO_P16_MODE == GPIO_MODE_OUTPUT)
    #define GPIO_P16_IO_MODE                       (GPIO_6_OUTPUT)  /* Pin 16 intput    */
#elif (GPIO_P16_MODE == GPIO_MODE_INPUT)
    #define GPIO_P16_IO_MODE                       (GPIO_6_INPUT)   /* Pin 16 output    */
#elif (GPIO_P16_MODE == GPIO_MODE_TS)
    #define GPIO_P16_TS_MODE                       (TS4)            /* Pin 16 touch source    */
#elif (GPIO_P16_MODE == GPIO_MODE_PWM)
    #define GPIO_P16_PWM_MODE                      (PWM1)           /* Pin 16 PWM    */
#elif (GPIO_P16_MODE == GPIO_MODE_NTC)
    #define GPIO_P16_NTC_MODE                      (NTC)            /* Pin 16 NTC1    */
#elif (GPIO_P16_MODE == GPIO_MODE_ADC)
    #define GPIO_P16_ADC_MODE                      (AN5)            /* Pin 16 NTC1    */
#else
    #error("The I/O configuration does not exist")
#endif

#if (GPIO_P17_MODE == GPIO_MODE_OUTPUT)
    #define GPIO_P17_IO_MODE                       (GPIO_7_OUTPUT)  /* Pin 17 intput    */
#elif (GPIO_P17_MODE == GPIO_MODE_INPUT)
    #define GPIO_P17_IO_MODE                       (GPIO_7_INPUT)   /* Pin 17 output    */
#elif (GPIO_P17_MODE == GPIO_MODE_TS)
    #define GPIO_P17_TS_MODE                       (TS5)            /* Pin 17 touch source    */
#elif (GPIO_P17_MODE == GPIO_MODE_TX0)
    #define GPIO_P17_UART_MODE                     (TX0)            /* Pin 17 UART TX0    */
#elif (GPIO_P17_MODE == GPIO_MODE_RX0)
    #define GPIO_P17_UART_MODE                     (RX0)            /* Pin 17 UART RX0    */
#elif (GPIO_P17_MODE == GPIO_MODE_MT0)
    #define GPIO_P17_UART_MODE                     (MT0)            /* Pin 17 UART TX0/RX0 MULT    */
#else
    #error("The I/O configuration does not exist")
#endif

#if (GPIO_P20_MODE == GPIO_MODE_OUTPUT)
    #define GPIO_P20_IO_MODE                       (GPIO_0_OUTPUT)  /* Pin 20 intput    */
#elif (GPIO_P20_MODE == GPIO_MODE_INPUT)
    #define GPIO_P20_IO_MODE                       (GPIO_0_INPUT)   /* Pin 20 output    */
#elif (GPIO_P20_MODE == GPIO_MODE_TX1)
    #define GPIO_P20_UART_MODE                     (TX1)            /* Pin 20 UART TX1    */
#elif (GPIO_P20_MODE == GPIO_MODE_RX1)
    #define GPIO_P20_UART_MODE                     (RX1)            /* Pin 20 UART RX1    */
#elif (GPIO_P20_MODE == GPIO_MODE_MT1)
    #define GPIO_P20_UART_MODE                     (MT1)            /* Pin 20 UART TX1/RX1 MULT    */
#elif (GPIO_P20_MODE == GPIO_MODE_SPI)
    #define GPIO_P20_SPI_MODE                      (SPI_SS)         /* Pin 20 SPI_SS    */
#else
    #error("The I/O configuration does not exist")
#endif
#if (GPIO_P21_MODE == GPIO_MODE_OUTPUT)
    #define GPIO_P21_IO_MODE                       (GPIO_1_OUTPUT)  /* Pin 21 intput    */
#elif (GPIO_P21_MODE == GPIO_MODE_INPUT)
    #define GPIO_P21_IO_MODE                       (GPIO_1_INPUT)   /* Pin 21 output    */
#elif (GPIO_P21_MODE == GPIO_MODE_TX1)
    #define GPIO_P21_UART_MODE                     (TX1)            /* Pin 21 UART TX1    */
#elif (GPIO_P21_MODE == GPIO_MODE_SPI)
    #define GPIO_P21_SPI_MODE                      (SPI_MISO)       /* Pin 21 SPI_MISO    */
#else
    #error("The I/O configuration does not exist")
#endif

#if (GPIO_P22_MODE == GPIO_MODE_OUTPUT)
    #define GPIO_P22_IO_MODE                       (GPIO_2_OUTPUT)  /* Pin 22 intput    */
#elif (GPIO_P22_MODE == GPIO_MODE_INPUT)
    #define GPIO_P22_IO_MODE                       (GPIO_2_INPUT)   /* Pin 22 output    */
#elif (GPIO_P22_MODE == GPIO_MODE_RX1)
    #define GPIO_P22_UART_MODE                     (RX1)            /* Pin 22 UART RX1    */
#elif (GPIO_P22_MODE == GPIO_MODE_SPI)
    #define GPIO_P22_SPI_MODE                      (SPI_MOSI)       /* Pin 22 SPI_MOSI    */
#else
    #error("The I/O configuration does not exist")
#endif

#if (GPIO_P23_MODE == GPIO_MODE_OUTPUT)
    #define GPIO_P23_IO_MODE                       (GPIO_3_OUTPUT)  /* Pin 23 intput    */
#elif (GPIO_P23_MODE == GPIO_MODE_INPUT)
    #define GPIO_P23_IO_MODE                       (GPIO_3_INPUT)   /* Pin 23 output    */
#elif (GPIO_P23_MODE == GPIO_MODE_ADC)
    #define GPIO_P23_CC_MODE                       (CC0)            /* Pin 23 CC    */
#elif (GPIO_P23_MODE == GPIO_MODE_SPI)
    #define GPIO_P23_SPI_MODE                      (SPI_MOSI)       /* Pin 23 SPI_MOSI    */
#else
    #error("The I/O configuration does not exist")
#endif

#if (GPIO_P24_MODE == GPIO_MODE_OUTPUT)
    #define GPIO_P24_IO_MODE                       (GPIO_4_OUTPUT)  /* Pin 24 intput    */
#elif (GPIO_P24_MODE == GPIO_MODE_INPUT)
    #define GPIO_P24_IO_MODE                       (GPIO_4_INPUT)   /* Pin 24 output    */
#elif (GPIO_P24_MODE == GPIO_MODE_SPI)
    #define GPIO_P24_SPI_MODE                      (SPI_MISO)       /* Pin 24 SPI_MISO    */
#else
    #error("The I/O configuration does not exist")
#endif

#if (GPIO_P25_MODE == GPIO_MODE_OUTPUT)
    #define GPIO_P25_IO_MODE                       (GPIO_5_OUTPUT)  /* Pin 25 intput    */
#elif (GPIO_P25_MODE == GPIO_MODE_INPUT)
    #define GPIO_P25_IO_MODE                       (GPIO_5_INPUT)   /* Pin 25 output    */
#elif (GPIO_P25_MODE == GPIO_MODE_CC)
    #define GPIO_P25_CC_MODE                       (CC1)            /* Pin 25 CC    */
#elif (GPIO_P25_MODE == GPIO_MODE_ADC)
    #define GPIO_P25_ADC_MODE                      (AN7)            /* Pin 25 CC    */
#elif (GPIO_P25_MODE == GPIO_MODE_SPI)
    #define GPIO_P25_SPI_MODE                      (SPI_SCK)        /* Pin 25 SPI_SCK    */
#else
    #error("The I/O configuration does not exist")
#endif

#if (GPIO_P26_MODE == GPIO_MODE_OUTPUT)
    #define GPIO_P26_IO_MODE                       (GPIO_6_OUTPUT)  /* Pin 26 intput    */
#elif (GPIO_P26_MODE == GPIO_MODE_INPUT)
    #define GPIO_P26_IO_MODE                       (GPIO_6_INPUT)   /* Pin 26 output    */
#elif (GPIO_P26_MODE == GPIO_MODE_CC)
    #define GPIO_P26_CC_MODE                       (CC1)            /* Pin 26 CC    */
#elif (GPIO_P26_MODE == GPIO_MODE_ADC)
    #define GPIO_P26_ADC_MODE                      (AN5)            /* Pin 26 CC    */
#elif (GPIO_P26_MODE == GPIO_MODE_SPI)
    #define GPIO_P26_SPI_MODE                      (SPI_SS)         /* Pin 26 SPI_SS    */
#else
    #error("The I/O configuration does not exist")
#endif

#if (GPIO_P27_MODE == GPIO_MODE_OUTPUT)
    #define GPIO_P27_IO_MODE                       (GPIO_7_OUTPUT)  /* Pin 27 intput    */
#elif (GPIO_P27_MODE == GPIO_MODE_INPUT)
    #define GPIO_P27_IO_MODE                       (GPIO_7_INPUT)   /* Pin 27 output    */
#elif (GPIO_P27_MODE == GPIO_MODE_CC)
    #define GPIO_P27_CC_MODE                       (CC2)            /* Pin 27 CC    */
#elif (GPIO_P27_MODE == GPIO_MODE_TX0)
    #define GPIO_P27_UART_MODE                     (TX0)            /* Pin 27 UART TX0    */
#elif (GPIO_P27_MODE == GPIO_MODE_RX0)
    #define GPIO_P27_UART_MODE                     (RX0)            /* Pin 27 UART RX0    */
#elif (GPIO_P27_MODE == GPIO_MODE_MT0)
    #define GPIO_P27_UART_MODE                     (MT0)            /* Pin 27 UART TX0/RX0 MULT    */
#elif (GPIO_P27_MODE == GPIO_MODE_TX1)
    #define GPIO_P27_UART_MODE                     (TX1)            /* Pin 27 UART TX1    */
#elif (GPIO_P27_MODE == GPIO_MODE_RX1)
    #define GPIO_P27_UART_MODE                     (RX1)            /* Pin 27 UART RX1    */
#elif (GPIO_P27_MODE == GPIO_MODE_MT1)
    #define GPIO_P27_UART_MODE                     (MT1)            /* Pin 27 UART TX1/RX1 MULT    */
#else
    #error("The I/O configuration does not exist")
#endif

#if (GPIO_P30_MODE == GPIO_MODE_OUTPUT)
    #define GPIO_P30_IO_MODE                       (GPIO_0_OUTPUT)  /* Pin 30 intput    */
#elif (GPIO_P30_MODE == GPIO_MODE_INPUT)
    #define GPIO_P30_IO_MODE                       (GPIO_0_INPUT)   /* Pin 30 output    */
#elif (GPIO_P30_MODE == GPIO_MODE_CC)
    #define GPIO_P30_CC_MODE                       (CC3)            /* Pin 30 CC    */
#elif (GPIO_P30_MODE == GPIO_MODE_TX0)
    #define GPIO_P30_UART_MODE                     (TX0)            /* Pin 30 UART TX0    */
#elif (GPIO_P30_MODE == GPIO_MODE_TX1)
    #define GPIO_P30_UART_MODE                     (TX1)            /* Pin 30 UART TX1    */
#elif (GPIO_P30_MODE == GPIO_MODE_RX1)
    #define GPIO_P30_UART_MODE                     (RX1)            /* Pin 30 UART RX1    */
#elif (GPIO_P30_MODE == GPIO_MODE_MT1)
    #define GPIO_P30_UART_MODE                     (MT1)            /* Pin 30 UART TX1/RX1 MULT    */
#elif (GPIO_P30_MODE == GPIO_MODE_SPI)
    #define GPIO_P30_SPI_MODE                      (SPI_SS)         /* Pin 30 SPI_SS    */
#else
    #error("The I/O configuration does not exist")
#endif

/**
 * @brief if not define, Set the register to its default value
 * 
 */
/*******  gpio   ****/
#define GPIO_PIN_P2_EFR_MODE                       (GPIO_P20_IO_MODE | GPIO_P21_IO_MODE | GPIO_P22_IO_MODE)

#ifndef GPIO_P00_IO_MODE
#define GPIO_P00_IO_MODE                           (GPIO_0_INPUT)
#endif
#ifndef GPIO_P01_IO_MODE
#define GPIO_P01_IO_MODE                           (GPIO_1_INPUT)
#endif
#ifndef GPIO_P02_IO_MODE
#define GPIO_P02_IO_MODE                           (GPIO_2_INPUT)
#endif
#ifndef GPIO_P03_IO_MODE
#define GPIO_P03_IO_MODE                           (GPIO_3_INPUT)
#endif
#ifndef GPIO_P04_IO_MODE
#define GPIO_P04_IO_MODE                           (GPIO_4_INPUT)
#endif
#ifndef GPIO_P05_IO_MODE
#define GPIO_P05_IO_MODE                           (GPIO_5_INPUT)
#endif
#ifndef GPIO_P06_IO_MODE
#define GPIO_P06_IO_MODE                           (GPIO_6_INPUT)
#endif
#ifndef GPIO_P07_IO_MODE
#define GPIO_P07_IO_MODE                           (GPIO_7_INPUT)
#endif
#ifndef GPIO_P10_IO_MODE
#define GPIO_P10_IO_MODE                           (GPIO_0_INPUT)
#endif
#ifndef GPIO_P11_IO_MODE
#define GPIO_P11_IO_MODE                           (GPIO_1_INPUT)
#endif
#ifndef GPIO_P12_IO_MODE
#define GPIO_P12_IO_MODE                           (GPIO_2_INPUT)
#endif
#ifndef GPIO_P13_IO_MODE
#define GPIO_P13_IO_MODE                           (GPIO_3_INPUT)
#endif
#ifndef GPIO_P14_IO_MODE
#define GPIO_P14_IO_MODE                           (GPIO_4_INPUT)
#endif
#ifndef GPIO_P15_IO_MODE
#define GPIO_P15_IO_MODE                           (GPIO_5_INPUT)
#endif
#ifndef GPIO_P16_IO_MODE
#define GPIO_P16_IO_MODE                           (GPIO_6_INPUT)
#endif
#ifndef GPIO_P17_IO_MODE
#define GPIO_P17_IO_MODE                           (GPIO_7_INPUT)
#endif
#ifndef GPIO_P20_IO_MODE
#define GPIO_P20_IO_MODE                           (GPIO_0_INPUT)
#endif
#ifndef GPIO_P21_IO_MODE
#define GPIO_P21_IO_MODE                           (GPIO_1_INPUT)
#endif
#ifndef GPIO_P22_IO_MODE
#define GPIO_P22_IO_MODE                           (GPIO_2_INPUT)
#endif
#ifndef GPIO_P23_IO_MODE
#define GPIO_P23_IO_MODE                           (GPIO_3_INPUT)
#endif
#ifndef GPIO_P24_IO_MODE
#define GPIO_P24_IO_MODE                           (GPIO_4_INPUT)
#endif
#ifndef GPIO_P25_IO_MODE
#define GPIO_P25_IO_MODE                           (GPIO_5_INPUT)
#endif
#ifndef GPIO_P26_IO_MODE
#define GPIO_P26_IO_MODE                           (GPIO_6_INPUT)
#endif
#ifndef GPIO_P27_IO_MODE
#define GPIO_P27_IO_MODE                           (GPIO_7_INPUT)
#endif
#ifndef GPIO_P30_IO_MODE
#define GPIO_P30_IO_MODE                           (GPIO_0_INPUT)
#endif
/*******  ntc   ****/
#ifndef GPIO_P03_NTC_MODE
#define GPIO_P03_NTC_MODE                          (NTC_NO_USE)
#endif
#ifndef GPIO_P01_NTC_MODE
#define GPIO_P01_NTC_MODE                          (NTC_NO_USE)
#endif
#ifndef GPIO_P16_NTC_MODE
#define GPIO_P16_NTC_MODE                          (NTC_NO_USE)
#endif
#if ((GPIO_P01_NTC_MODE == NTC) && (GPIO_P16_NTC_MODE == NTC))
    #error("P01 and P16 only enable one")
#endif
/*******  adc   ****/
#ifndef GPIO_P01_ADC_MODE
    #if(GPIO_P01_NTC_MODE)
        #define GPIO_P01_ADC_MODE                  (AN3)
    #else
        #define GPIO_P01_ADC_MODE                  (ADC_NO_USE)
    #endif
#endif
#ifndef GPIO_P02_ADC_MODE
    #if(GPIO_P03_NTC_MODE)
        #define GPIO_P02_ADC_MODE                  (AN2)
    #else
        #define GPIO_P02_ADC_MODE                  (ADC_NO_USE)
    #endif
#endif
#ifndef GPIO_P03_ADC_MODE
#define GPIO_P03_ADC_MODE                          (ADC_NO_USE)
#endif
#ifndef GPIO_P06_ADC_MODE
#define GPIO_P06_ADC_MODE                          (ADC_NO_USE)
#endif
#ifndef GPIO_P11_ADC_MODE
#define GPIO_P11_ADC_MODE                          (ADC_NO_USE)
#endif
#ifndef GPIO_P16_ADC_MODE
    #if(GPIO_P16_NTC_MODE)
        #define GPIO_P16_ADC_MODE                  (AN5)
    #else
        #define GPIO_P16_ADC_MODE                  (ADC_NO_USE)
    #endif
#endif
#ifndef GPIO_P25_ADC_MODE
#define GPIO_P25_ADC_MODE                          (ADC_NO_USE)
#endif
#ifndef GPIO_P26_ADC_MODE
#define GPIO_P26_ADC_MODE                          (ADC_NO_USE)
#endif
#ifndef VBAT_ADC_MODE
    #if(CONFIG_USING_CHARGER)
        #define VBAT_ADC_MODE                       (VBAT)
    #else
        #define VBAT_ADC_MODE                       (ADC_NO_USE)
    #endif
#endif
#ifndef IBAT_ADC_MODE
#define IBAT_ADC_MODE                              (ADC_NO_USE)
#endif
#ifndef VREF_ADC_MODE
    #if (CONFIG_IC_TYPE > CHIP_SS880X)
        #define VREF_ADC_MODE                      (VREF)
    #else
        #define VREF_ADC_MODE                      (ADC_NO_USE)
    #endif
#endif
/*******  pwm   ****/
#ifndef GPIO_P00_PWM_MODE
#define GPIO_P00_PWM_MODE                          (PWM_NO_USE)
#endif
#ifndef GPIO_P01_PWM_MODE
#define GPIO_P01_PWM_MODE                          (PWM_NO_USE)
#endif
#ifndef GPIO_P13_PWM_MODE
#define GPIO_P13_PWM_MODE                          (PWM_NO_USE)
#endif
#ifndef GPIO_P16_PWM_MODE
#define GPIO_P16_PWM_MODE                          (PWM_NO_USE)
#endif
/*******  cmp   ****/
#ifndef GPIO_P00_CMP_MODE
#define GPIO_P00_CMP_MODE                          (CMP_NO_USE)
#endif
#ifndef GPIO_P04_CMP_MODE
#define GPIO_P04_CMP_MODE                          (CMP_NO_USE)
#endif
/*******  cc   ****/
#ifndef GPIO_P02_CC_MODE
#define GPIO_P02_CC_MODE                           (CC_NO_USE)
#endif
#ifndef GPIO_P04_CC_MODE
#define GPIO_P04_CC_MODE                           (CC_NO_USE)
#endif
#ifndef GPIO_P05_CC_MODE
#define GPIO_P05_CC_MODE                           (CC_NO_USE)
#endif
#ifndef GPIO_P06_CC_MODE
#define GPIO_P06_CC_MODE                           (CC_NO_USE)
#endif
#ifndef GPIO_P07_CC_MODE
#define GPIO_P07_CC_MODE                           (CC_NO_USE)
#endif
#ifndef GPIO_P10_CC_MODE
#define GPIO_P10_CC_MODE                           (CC_NO_USE)
#endif
#ifndef GPIO_P14_CC_MODE
#define GPIO_P14_CC_MODE                           (CC_NO_USE)
#endif
#ifndef GPIO_P15_CC_MODE
#define GPIO_P15_CC_MODE                           (CC_NO_USE)
#endif
#ifndef GPIO_P23_CC_MODE
#define GPIO_P23_CC_MODE                           (CC_NO_USE)
#endif
#ifndef GPIO_P25_CC_MODE
#define GPIO_P25_CC_MODE                           (CC_NO_USE)
#endif
#ifndef GPIO_P26_CC_MODE
#define GPIO_P26_CC_MODE                           (CC_NO_USE)
#endif
#ifndef GPIO_P27_CC_MODE
#define GPIO_P27_CC_MODE                           (CC_NO_USE)
#endif
#ifndef GPIO_P30_CC_MODE
#define GPIO_P30_CC_MODE                           (CC_NO_USE)
#endif
/*******  touch source   ****/
#ifndef GPIO_P10_TS_MODE
#define GPIO_P10_TS_MODE                           (TS_NO_USE)
#endif
#ifndef GPIO_P12_TS_MODE
#define GPIO_P12_TS_MODE                           (TS_NO_USE)
#endif
#ifndef GPIO_P14_TS_MODE
#define GPIO_P14_TS_MODE                           (TS_NO_USE)
#endif
#ifndef GPIO_P15_TS_MODE
#define GPIO_P15_TS_MODE                           (TS_NO_USE)
#endif
#ifndef GPIO_P16_TS_MODE
#define GPIO_P16_TS_MODE                           (TS_NO_USE)
#endif
#ifndef GPIO_P17_TS_MODE
#define GPIO_P17_TS_MODE                           (TS_NO_USE)
#endif
/*******  uart rx/tx   ****/
#ifndef GPIO_P01_UART_MODE
#define GPIO_P01_UART_MODE                         (UART_NO_USE)
#endif
#ifndef GPIO_P06_UART_MODE
#define GPIO_P06_UART_MODE                         (UART_NO_USE)
#endif
#ifndef GPIO_P11_UART_MODE
#define GPIO_P11_UART_MODE                         (UART_NO_USE)
#endif
#ifndef GPIO_P12_UART_MODE
#define GPIO_P12_UART_MODE                         (UART_NO_USE)
#endif
#ifndef GPIO_P17_UART_MODE
#define GPIO_P17_UART_MODE                         (UART_NO_USE)
#endif
#ifndef GPIO_P20_UART_MODE
#define GPIO_P20_UART_MODE                         (UART_NO_USE)
#endif
#ifndef GPIO_P21_UART_MODE
#define GPIO_P21_UART_MODE                         (UART_NO_USE)
#endif
#ifndef GPIO_P22_UART_MODE
#define GPIO_P22_UART_MODE                         (UART_NO_USE)
#endif
#ifndef GPIO_P27_UART_MODE
#define GPIO_P27_UART_MODE                         (UART_NO_USE)
#endif
#ifndef GPIO_P30_UART_MODE
#define GPIO_P30_UART_MODE                         (UART_NO_USE)
#endif
/*******  EINT   ****/
#ifndef GPIO_P03_EINT_MODE
#define GPIO_P03_EINT_MODE                         (EINT_NO_USE)
#endif
#ifndef GPIO_P04_EINT_MODE
#define GPIO_P04_EINT_MODE                         (EINT_NO_USE)
#endif
#ifndef GPIO_P10_EINT_MODE
#define GPIO_P10_EINT_MODE                         (EINT_NO_USE)
#endif
#ifndef GPIO_P14_EINT_MODE
#define GPIO_P14_EINT_MODE                         (EINT_NO_USE)
#endif

/*******  SPI   ****/
#ifndef GPIO_P05_SPI_MODE
#define GPIO_P05_SPI_MODE                          (SPI_NO_USE)
#endif
#ifndef GPIO_P14_SPI_MODE
#define GPIO_P14_SPI_MODE                          (SPI_NO_USE)
#endif
#ifndef GPIO_P20_SPI_MODE
#define GPIO_P20_SPI_MODE                          (SPI_NO_USE)
#endif
#ifndef GPIO_P21_SPI_MODE
#define GPIO_P21_SPI_MODE                          (SPI_NO_USE)
#endif
#ifndef GPIO_P22_SPI_MODE
#define GPIO_P22_SPI_MODE                          (SPI_NO_USE)
#endif
#ifndef GPIO_P23_SPI_MODE
#define GPIO_P23_SPI_MODE                          (SPI_NO_USE)
#endif
#ifndef GPIO_P24_SPI_MODE
#define GPIO_P24_SPI_MODE                          (SPI_NO_USE)
#endif
#ifndef GPIO_P25_SPI_MODE
#define GPIO_P25_SPI_MODE                          (SPI_NO_USE)
#endif
#ifndef GPIO_P26_SPI_MODE
#define GPIO_P26_SPI_MODE                          (SPI_NO_USE)
#endif
#ifndef GPIO_P30_SPI_MODE
#define GPIO_P30_SPI_MODE                          (SPI_NO_USE)
#endif

#ifndef GPIO_P07_PFO_MODE
#define GPIO_P07_PFO_MODE                          (PFO_NO_USE)
#endif

#define GPIO_PIN_P0_MODE                           (GPIO_P00_IO_MODE | GPIO_P01_IO_MODE | GPIO_P02_IO_MODE | GPIO_P03_IO_MODE | GPIO_P04_IO_MODE |\
                                                    GPIO_P05_IO_MODE | GPIO_P06_IO_MODE | GPIO_P07_IO_MODE)

#define GPIO_PIN_P1_MODE                           (GPIO_P10_IO_MODE | GPIO_P11_IO_MODE | GPIO_P12_IO_MODE |  GPIO_P13_IO_MODE | GPIO_P14_IO_MODE)

#define GPIO_PIN_P1_EFR_MODE                       (GPIO_P15_IO_MODE | GPIO_P16_IO_MODE | GPIO_P17_IO_MODE)

#define GPIO_PIN_P2_EFR_MODE                       (GPIO_P20_IO_MODE | GPIO_P21_IO_MODE | GPIO_P22_IO_MODE)

#define GPIO_PIN_P2_EXT_MODE                       (GPIO_P30_IO_MODE | GPIO_P23_IO_MODE | GPIO_P24_IO_MODE | GPIO_P25_IO_MODE | GPIO_P26_IO_MODE |\
                                                    GPIO_P27_IO_MODE)

/** 
 * default VBAT is on, IBAT and VREF is off 
 * channel enable bit mask:
 *  bit 7    6    5    4    3    2    1    0
 *      AN7  AN6  AN5  AN4  AN3  AN2  IBAT VBAT
 * */
#define ADC_CHANNEL_MODE                           (VBAT_ADC_MODE | GPIO_P01_ADC_MODE | GPIO_P02_ADC_MODE | GPIO_P03_ADC_MODE | \
                                                    GPIO_P06_ADC_MODE | GPIO_P11_ADC_MODE | GPIO_P16_ADC_MODE | IBAT_ADC_MODE | \
                                                    VREF_ADC_MODE | GPIO_P25_ADC_MODE | GPIO_P26_ADC_MODE)

#define CC_CHANNEL_MODE                            (GPIO_P02_CC_MODE | GPIO_P04_CC_MODE | GPIO_P05_CC_MODE | GPIO_P06_CC_MODE | \
                                                    GPIO_P07_CC_MODE | GPIO_P10_CC_MODE | GPIO_P14_CC_MODE | GPIO_P15_CC_MODE | \
                                                    GPIO_P23_CC_MODE | GPIO_P25_CC_MODE | GPIO_P26_CC_MODE | GPIO_P27_CC_MODE | \
                                                    GPIO_P30_CC_MODE)

#define TS_CHANNEL_MODE                            (GPIO_P10_TS_MODE | GPIO_P12_TS_MODE | GPIO_P14_TS_MODE | GPIO_P15_TS_MODE | \
                                                    GPIO_P16_TS_MODE | GPIO_P17_TS_MODE)

#define P0_PULL_MODE                               (GPIO_P00_PULL | GPIO_P01_PULL | GPIO_P02_PULL | GPIO_P03_PULL | GPIO_P04_PULL | \
                                                    GPIO_P05_PULL | GPIO_P06_PULL |GPIO_P07_PULL)

#define P1_PULL_MODE                               (GPIO_P10_PULL | GPIO_P11_PULL | GPIO_P12_PULL | GPIO_P13_PULL | GPIO_P14_PULL)

#define P1_EFR_PULL_MODE                           (GPIO_P15_PULL | GPIO_P16_PULL | GPIO_P17_PULL)

#define P2_EFR_PULL_MODE                           (GPIO_P20_PULL | GPIO_P21_PULL | GPIO_P22_PULL)

#define P2_PULL_MODE                               (GPIO_P23_PULL | GPIO_P24_PULL | GPIO_P25_PULL | GPIO_P26_PULL | GPIO_P27_PULL | GPIO_P30_PULL)

#define PWM_CHANNEL_MODE                           (GPIO_P00_PWM_MODE | GPIO_P01_PWM_MODE | GPIO_P13_PWM_MODE | GPIO_P16_PWM_MODE)

#define CMP_CHANNEL_MODE                           (GPIO_P00_CMP_MODE | GPIO_P04_CMP_MODE)

#define UART_CHANNEL_MODE                          (GPIO_P01_UART_MODE | GPIO_P06_UART_MODE | GPIO_P11_UART_MODE | GPIO_P12_UART_MODE | \
                                                    GPIO_P17_UART_MODE | GPIO_P20_UART_MODE | GPIO_P21_UART_MODE | GPIO_P27_UART_MODE | GPIO_P30_UART_MODE)

#define SPI_CHANNEL_MODE                           (GPIO_P05_SPI_MODE | GPIO_P14_SPI_MODE | GPIO_P20_SPI_MODE | GPIO_P21_SPI_MODE | \
                                                    GPIO_P22_SPI_MODE | GPIO_P23_SPI_MODE | GPIO_P24_SPI_MODE | GPIO_P25_SPI_MODE | \
                                                    GPIO_P26_SPI_MODE | GPIO_P30_SPI_MODE)

/**
 * @brief General I/O
 * IO default input
 */

/**
 * @brief redefine gpio, and read
 * 
 */

// P00~P07
#define P0_MASK                                    (0xFF)
#define P00                                        (0x00)
#define _P00                                       (P0_0)
#define P01                                        (0x01)
#define _P01                                       (P0_1)
#define P02                                        (0x02)
#define _P02                                       (P0_2)
#define P03                                        (0x03)
#define _P03                                       (P0_3)
#define P04                                        (0x04)
#define _P04                                       (P0_4)
#define P05                                        (0x05)
#define _P05                                       (P0_5)
#define P06                                        (0x06)
#define _P06                                       (P0_6)
#define P07                                        (0x07)
#define _P07                                       (P0_7)
// P10~P14
#define P1_MASK                                    (0x1F)
#define P10                                        (0x10)
#define _P10                                       (P1_0)
#define P11                                        (0x11)
#define _P11                                       (P1_1)
#define P12                                        (0x12)
#define _P12                                       (P1_2)
#define P13                                        (0x13)
#define _P13                                       (P1_3)
#define P14                                        (0x14)
#define _P14                                       (P1_4)
// P15~P17
#define EFR1_MASK                                  (0xE0)
#define P15                                        (0x15)
#define _P15                                       (!!READ_EFR_BIT(PEXTCON0, (1 << ((P15 & 0xf) - 5))))
#define P16                                        (0x16)
#define _P16                                       (!!READ_EFR_BIT(PEXTCON0, (1 << ((P16 & 0xf) - 5))))
#define P17                                        (0x17)
#define _P17                                       (!!READ_EFR_BIT(PEXTCON0, (1 << ((P17 & 0xf) - 5))))
// P20~P21
#define EFR2_MASK                                  (0x07)
#define P20                                        (0x20)
#define _P20                                       (!!READ_EFR_BIT(PEXTCON2, (1 << (P20 & 0xf))))
#define P21                                        (0x21)
#define _P21                                       (!!READ_EFR_BIT(PEXTCON2, (1 << (P21 & 0xf))))
#define P22                                        (0x22)
#define _P22                                       (!!READ_EFR_BIT(PEXTCON2, (1 << (P22 & 0xf))))

// P23~P30
#define P2_MASK                                    (0xF9)

#define P23                                        (0x23)
#define _P23                                       (P2_3)
#define P24                                        (0x24)
#define _P24                                       (P2_4)
#define P25                                        (0x25)
#define _P25                                       (P2_5)
#define P26                                        (0x26)
#define _P26                                       (P2_6)
#define P27                                        (0x27)
#define _P27                                       (P2_7)
#define P30                                        (0x30)
#define _P30                                       (P3_0)

#define UNUSE                                      (0xFF)

/***       output operate     ****/

#define _P00_EN(en)                                (P0_0 = en)

#define _P01_EN(en)                                (P0_1 = en)

#define _P02_EN(en)                                (P0_2 = en)

#define _P03_EN(en)                                (P0_3 = en)

#define _P04_EN(en)                                (P0_4 = en)

#define _P05_EN(en)                                (P0_5 = en)

#define _P06_EN(en)                                (P0_6 = en)

#define _P07_EN(en)                                (P0_7 = en)

#define _P10_EN(en)                                (P1_0 = en)

#define _P11_EN(en)                                (P1_1 = en)

#define _P12_EN(en)                                (P1_2 = en)

#define _P13_EN(en)                                (P1_3 = en)

#define _P14_EN(en)                                (P1_4 = en)

#define _P15_EN(en)                                MODIFY_EFR_REG(PEXTCON0, 0x11, (en << 0))

#define _P16_EN(en)                                MODIFY_EFR_REG(PEXTCON0, 0x22, (en << 1))

#define _P17_EN(en)                                MODIFY_EFR_REG(PEXTCON0, 0x44, (en << 2))

#define _P20_EN(en)                                MODIFY_EFR_REG(PEXTCON2, 0x11, (en << 0))

#define _P21_EN(en)                                MODIFY_EFR_REG(PEXTCON2, 0x22, (en << 1))

#define _P22_EN(en)                                MODIFY_EFR_REG(PEXTCON2, 0x44, (en << 2))

#if (CONFIG_IC_TYPE == CHIP_SS888X)
#define _P23_EN(en)                                (P2_3 = en)

#define _P24_EN(en)                                (P2_4 = en)

#define _P25_EN(en)                                (P2_5 = en)

#define _P26_EN(en)                                (P2_6 = en)

#define _P27_EN(en)                                (P2_7 = en)

#define _P30_EN(en)                                (P3_0 = en)
#endif


/**
 * @brief io pull enable or disable
 * eg.  _P00_IO_PULLUP(SET)/_P00_IO_PULLUP(RESET)
 * 
 */
#define _P00_IO_PULLUP(en)                         MODIFY_REG(P0PU, (1 << 0), (en << 0))
#define _P00_IO_PULLDOWN(en)                       MODIFY_REG(P0PD, (1 << 0), (en << 0))
#define _P01_IO_PULLUP(en)                         MODIFY_REG(P0PU, (1 << 1), (en << 1))
#define _P01_IO_PULLDOWN(en)                       MODIFY_REG(P0PD, (1 << 1), (en << 1))
#define _P02_IO_PULLUP(en)                         MODIFY_REG(P0PU, (1 << 2), (en << 2))
#define _P02_IO_PULLDOWN(en)                       MODIFY_REG(P0PD, (1 << 2), (en << 2))
#define _P03_IO_PULLUP(en)                         MODIFY_REG(P0PU, (1 << 3), (en << 3))
#define _P03_IO_PULLDOWN(en)                       MODIFY_REG(P0PD, (1 << 3), (en << 3))
#define _P04_IO_PULLUP(en)                         MODIFY_REG(P0PU, (1 << 4), (en << 4))
#define _P04_IO_PULLDOWN(en)                       MODIFY_REG(P0PD, (1 << 4), (en << 4))
#define _P05_IO_PULLUP(en)                         MODIFY_REG(P0PU, (1 << 5), (en << 5))
#define _P05_IO_PULLDOWN(en)                       MODIFY_REG(P0PD, (1 << 5), (en << 5))
#define _P06_IO_PULLUP(en)                         MODIFY_REG(P0PU, (1 << 6), (en << 6))
#define _P06_IO_PULLDOWN(en)                       MODIFY_REG(P0PD, (1 << 6), (en << 6))
#define _P07_IO_PULLUP(en)                         MODIFY_REG(P0PU, (1 << 7), (en << 7))
#define _P07_IO_PULLDOWN(en)                       MODIFY_REG(P0PD, (1 << 7), (en << 7))

#define _P10_IO_PULLUP(en)                         MODIFY_REG(P1PUPD, (1 << 4), (en << 4))
#define _P10_IO_PULLDOWN(en)                       MODIFY_REG(P1PUPD, (1 << 0), (en << 0))
#define _P11_IO_PULLUP(en)                         MODIFY_REG(P1PUPD, (1 << 5), (en << 5))
#define _P11_IO_PULLDOWN(en)                       MODIFY_REG(P1PUPD, (1 << 1), (en << 1))
#define _P12_IO_PULLUP(en)                         MODIFY_REG(P1PUPD, (1 << 6), (en << 6))
#define _P12_IO_PULLDOWN(en)                       MODIFY_REG(P1PUPD, (1 << 2), (en << 2))
#define _P13_IO_PULLUP(en)                         MODIFY_REG(P1PUPD, (1 << 7), (en << 7))
#define _P13_IO_PULLDOWN(en)                       MODIFY_REG(P1PUPD, (1 << 3), (en << 3))
#define _P14_IO_PULLUP(en)                         MODIFY_REG(PDRV0, (1 << 6), (en << 6))
#define _P14_IO_PULLDOWN(en)                       MODIFY_REG(PDRV0, (1 << 5), (en << 5))
#define _P15_IO_PULLUP(en)                         MODIFY_EFR_REG(PEXTCON1, (1 << 4), (en << 4))
#define _P15_IO_PULLDOWN(en)                       MODIFY_EFR_REG(PEXTCON1, (1 << 0), (en << 0))
#define _P16_IO_PULLUP(en)                         MODIFY_EFR_REG(PEXTCON1, (1 << 5), (en << 5))
#define _P16_IO_PULLDOWN(en)                       MODIFY_EFR_REG(PEXTCON1, (1 << 1), (en << 1))
#define _P17_IO_PULLUP(en)                         MODIFY_EFR_REG(PEXTCON1, (1 << 6), (en << 6))
#define _P17_IO_PULLDOWN(en)                       MODIFY_EFR_REG(PEXTCON1, (1 << 2), (en << 2))

#define _P20_IO_PULLUP(en)                         MODIFY_EFR_REG(PEXTCON3, (1 << 4), (en << 4))
#define _P20_IO_PULLDOWN(en)                       MODIFY_EFR_REG(PEXTCON3, (1 << 0), (en << 0))
#define _P21_IO_PULLUP(en)                         MODIFY_EFR_REG(PEXTCON3, (1 << 5), (en << 5))
#define _P21_IO_PULLDOWN(en)                       MODIFY_EFR_REG(PEXTCON3, (1 << 1), (en << 1))
#define _P22_IO_PULLUP(en)                         MODIFY_EFR_REG(PEXTCON3, (1 << 6), (en << 6))
#define _P22_IO_PULLDOWN(en)                       MODIFY_EFR_REG(PEXTCON3, (1 << 2), (en << 2))

#if (CONFIG_IC_TYPE == CHIP_SS888X)
// P23~P30 no support pulldown(P2PU0)
#define _P23_IO_PULLUP(en)                         MODIFY_REG(P2PU0, (1 << 3), (en << 3))
#define _P23_IO_PULLDOWN(en)                       en
#define _P24_IO_PULLUP(en)                         MODIFY_REG(P2PU0, (1 << 4), (en << 4))
#define _P24_IO_PULLDOWN(en)                       en
#define _P25_IO_PULLUP(en)                         MODIFY_REG(P2PU0, (1 << 5), (en << 5))
#define _P25_IO_PULLDOWN(en)                       en
#define _P26_IO_PULLUP(en)                         MODIFY_REG(P2PU0, (1 << 6), (en << 6))
#define _P26_IO_PULLDOWN(en)                       en
// P27 P30 pull up is 2.5k default(P2PU1)
#define _P27_IO_PULLUP(en)                         MODIFY_REG(P2PU1, (3 << 2), (en << 2))
#define _P27_IO_PULLDOWN(en)                       en

#define _P30_IO_PULLUP(en)                         MODIFY_REG(P2PU1, (3 << 6), (en << 6))
#define _P30_IO_PULLDOWN(en)                       en
#endif

/**
 * @brief io function change
 * 
 */
#define  _P00_IO_INPUT()                           SET_BIT(P0MOD, 0x01)
#define  _P00_IO_OUTPUT()                          CLEAR_BIT(P0MOD, 0x01)
#define  _P01_IO_INPUT()                           SET_BIT(P0MOD, 0x02)
#define  _P01_IO_OUTPUT()                          CLEAR_BIT(P0MOD, 0x02)
#define  _P02_IO_INPUT()                           SET_BIT(P0MOD, 0x04)
#define  _P02_IO_OUTPUT()                          CLEAR_BIT(P0MOD, 0x04)
#define  _P03_IO_INPUT()                           SET_BIT(P0MOD, 0x08)
#define  _P03_IO_OUTPUT()                          CLEAR_BIT(P0MOD, 0x08)
#define  _P04_IO_INPUT()                           SET_BIT(P0MOD, 0x10)
#define  _P04_IO_OUTPUT()                          CLEAR_BIT(P0MOD, 0x10)
#define  _P05_IO_INPUT()                           SET_BIT(P0MOD, 0x20)
#define  _P05_IO_OUTPUT()                          CLEAR_BIT(P0MOD, 0x20)
#define  _P06_IO_INPUT()                           SET_BIT(P0MOD, 0x40)
#define  _P06_IO_OUTPUT()                          CLEAR_BIT(P0MOD, 0x40)
#define  _P07_IO_INPUT()                           SET_BIT(P0MOD, 0x80)
#define  _P07_IO_OUTPUT()                          CLEAR_BIT(P0MOD, 0x80)

#define  _P10_IO_INPUT()                           SET_BIT(P1MOD, 0x01)
#define  _P10_IO_OUTPUT()                          CLEAR_BIT(P1MOD, 0x01)
#define  _P11_IO_INPUT()                           SET_BIT(P1MOD, 0x02)
#define  _P11_IO_OUTPUT()                          CLEAR_BIT(P1MOD, 0x02)
#define  _P12_IO_INPUT()                           SET_BIT(P1MOD, 0x04)
#define  _P12_IO_OUTPUT()                          CLEAR_BIT(P1MOD, 0x04)
#define  _P13_IO_INPUT()                           SET_BIT(P1MOD, 0x08)
#define  _P13_IO_OUTPUT()                          CLEAR_BIT(P1MOD, 0x08)
#define  _P14_IO_INPUT()                           SET_BIT(P1MOD, 0x10)
#define  _P14_IO_OUTPUT()                          CLEAR_BIT(P1MOD, 0x10)
#define  _P15_IO_INPUT()                           SET_EFR_BIT(PEXTCON0, 0x10)
#define  _P15_IO_OUTPUT()                          CLEAR_EFR_BIT(PEXTCON0, 0x10)
#define  _P16_IO_INPUT()                           SET_EFR_BIT(PEXTCON0, 0x20)
#define  _P16_IO_OUTPUT()                          CLEAR_EFR_BIT(PEXTCON0, 0x20)
#define  _P17_IO_INPUT()                           SET_EFR_BIT(PEXTCON0, 0x40)
#define  _P17_IO_OUTPUT()                          CLEAR_EFR_BIT(PEXTCON0, 0x40)

#define  _P20_IO_INPUT()                           SET_EFR_BIT(PEXTCON2, 0x10)
#define  _P20_IO_OUTPUT()                          CLEAR_EFR_BIT(PEXTCON2, 0x10)
#define  _P21_IO_INPUT()                           SET_EFR_BIT(PEXTCON2, 0x20)
#define  _P21_IO_OUTPUT()                          CLEAR_EFR_BIT(PEXTCON2, 0x20)
#define  _P22_IO_INPUT()                           SET_EFR_BIT(PEXTCON2, 0x40)
#define  _P22_IO_OUTPUT()                          CLEAR_EFR_BIT(PEXTCON2, 0x40)
#if (CONFIG_IC_TYPE == CHIP_SS888X)
#define  _P23_IO_INPUT()                           SET_BIT(P2MOD, 0x08)
#define  _P23_IO_OUTPUT()                          CLEAR_BIT(P2MOD, 0x08)
#define  _P24_IO_INPUT()                           SET_BIT(P2MOD, 0x10)
#define  _P24_IO_OUTPUT()                          CLEAR_BIT(P2MOD, 0x10)
#define  _P25_IO_INPUT()                           SET_BIT(P2MOD, 0x20)
#define  _P25_IO_OUTPUT()                          CLEAR_BIT(P2MOD, 0x20)
#define  _P26_IO_INPUT()                           SET_BIT(P2MOD, 0x40)
#define  _P26_IO_OUTPUT()                          CLEAR_BIT(P2MOD, 0x40)
#define  _P27_IO_INPUT()                           SET_BIT(P2MOD, 0x80)
#define  _P27_IO_OUTPUT()                          CLEAR_BIT(P2MOD, 0x80)

#define  _P30_IO_INPUT()                           SET_BIT(P2MOD, 0x01)
#define  _P30_IO_OUTPUT()                          CLEAR_BIT(P2MOD, 0x01)
#endif

/*****************   change to gpio mode   ***/
#define  _P00_IO_MODE()                            CLEAR_BIT(MFP0, 0x03)
#define  _P01_IO_MODE()                            CLEAR_BIT(MFP0, 0x0C)
#define  _P02_IO_MODE()                            CLEAR_BIT(MFP0, 0x30)
#define  _P03_IO_MODE()                            CLEAR_BIT(MFP0, 0xC0)
#define  _P04_IO_MODE()                            CLEAR_BIT(MFP1, 0x03)
#define  _P05_IO_MODE()                            CLEAR_BIT(MFP1, 0x0C)
#define  _P06_IO_MODE()                            CLEAR_BIT(MFP1, 0x30)
#define  _P07_IO_MODE()                            CLEAR_BIT(MFP1, 0xC0)
#define  _P10_IO_MODE()                            CLEAR_BIT(MFP2, 0x03)
#define  _P11_IO_MODE()                            CLEAR_BIT(MFP2, 0x0C)
#define  _P12_IO_MODE()                            CLEAR_BIT(MFP2, 0x30)
#define  _P13_IO_MODE()                            CLEAR_BIT(MFP2, 0xC0)
#define  _P14_IO_MODE()                            CLEAR_BIT(MFP3, 0x30)
#define  _P15_IO_MODE()                            CLEAR_EFR_BIT(EXTMFP0, 0xC0)
#define  _P16_IO_MODE()                            CLEAR_EFR_BIT(EXTMFP1, 0x03)
#define  _P17_IO_MODE()                            CLEAR_EFR_BIT(EXTMFP1, 0x0C)
#define  _P20_IO_MODE()                            CLEAR_EFR_BIT(EXTMFP2, 0x03)
#define  _P21_IO_MODE()                            CLEAR_EFR_BIT(EXTMFP2, 0x0C)
#define  _P22_IO_MODE()                            CLEAR_EFR_BIT(EXTMFP2, 0x30)
#if (CONFIG_IC_TYPE == CHIP_SS888X)
#define  _P23_IO_MODE()                            CLEAR_EFR_BIT(EXTMFP3, 0x03)
#define  _P24_IO_MODE()                            CLEAR_EFR_BIT(EXTMFP3, 0x0C)
#define  _P25_IO_MODE()                            CLEAR_EFR_BIT(EXTMFP3, 0x30)
#define  _P26_IO_MODE()                            CLEAR_EFR_BIT(EXTMFP3, 0xC0)
#define  _P27_IO_MODE()                            CLEAR_EFR_BIT(EXTMFP4, 0x07)
#define  _P30_IO_MODE()                            CLEAR_EFR_BIT(EXTMFP4, 0x38)
#endif

/*****************   change to cc mode   ***/
#define  _P02_IO_CC0()                             MODIFY_REG(MFP0, 0x30, 0x30)
#define  _P04_IO_CC0()                             MODIFY_REG(MFP1, 0x03, 0x01)
#define  _P05_IO_CC1()                             MODIFY_REG(MFP1, 0x0C, 0x04)
#define  _P06_IO_CC2()                             MODIFY_REG(MFP1, 0x30, 0x10)
#define  _P07_IO_CC3()                             MODIFY_REG(MFP1, 0xC0, 0x40)
#define  _P10_IO_CC1()                             MODIFY_REG(MFP2, 0x03, 0x03)
#define  _P14_IO_CC2()                             MODIFY_REG(MFP3, 0x30, 0x20)
#define  _P15_IO_CC2()                             MODIFY_EFR_REG(EXTMFP0, 0xC0, 0xC0)
#if (CONFIG_IC_TYPE == CHIP_SS888X)
#define  _P23_IO_CC0()                             MODIFY_EFR_REG(EXTMFP3, 0x03, 0x01)
#define  _P25_IO_CC0()                             MODIFY_EFR_REG(EXTMFP3, 0x30, 0x10)
#define  _P26_IO_CC1()                             MODIFY_EFR_REG(EXTMFP3, 0xC0, 0x40)
#define  _P27_IO_CC2()                             MODIFY_EFR_REG(EXTMFP4, 0x07, 0x07)
#define  _P30_IO_CC3()                             MODIFY_EFR_REG(EXTMFP4, 0x38, 0x38)
#endif

/*****************   change to pwm mode   ***/
#define  _P00_IO_PWM0()                            MODIFY_REG(MFP0, 0x03, 0x01)
#define  _P01_IO_PWM1()                            MODIFY_REG(MFP0, 0x0C, 0x04)
#define  _P13_IO_PWM1()                            MODIFY_REG(MFP2, 0xC0, 0x80)
#define  _P16_IO_PWM1()                            MODIFY_EFR_REG(EXTMFP1, 0x03, 0x03)

/*****************   change to uart mode   ***/
#define  _P01_IO_TX0()                             do {_P01_IO_PULLUP(SET); MODIFY_REG(MFP0, 0x0C, 0x08);} while (0)
#define  _P06_IO_TX0()                             do {_P06_IO_PULLUP(SET); MODIFY_REG(MFP3, 0x0C, 0x08); MODIFY_REG(MFP1, 0x30, 0x20);} while (0)
#define  _P06_IO_RX0()                             do {_P06_IO_PULLUP(SET); MODIFY_REG(MFP3, 0x0C, 0x04); MODIFY_REG(MFP1, 0x30, 0x20);} while (0)
#define  _P11_IO_TX0()                             do {_P11_IO_PULLUP(SET); MODIFY_REG(MFP3, 0x03, 0x01); MODIFY_REG(MFP2, 0x0C, 0x04);} while (0)
#define  _P11_IO_RX0()                             do {_P11_IO_PULLUP(SET); MODIFY_REG(MFP3, 0x03, 0x02); MODIFY_REG(MFP2, 0x0C, 0x04);} while (0)
#define  _P12_IO_RX0()                             do {_P12_IO_PULLUP(SET); MODIFY_REG(MFP2, 0x30, 0x20);} while (0)
#define  _P17_IO_TX0()                             do {_P17_IO_PULLUP(SET); MODIFY_EFR_REG(EXTMFP1, 0x0C, 0x0C);} while (0)
#define  _P17_IO_RX0()                             do {_P17_IO_PULLUP(SET); MODIFY_EFR_REG(EXTMFP1, 0x0C, 0x08);} while (0)

#if (CONFIG_IC_TYPE == CHIP_SS888X)
#define  _P20_IO_TX1()                             do {_P20_IO_PULLUP(SET); MODIFY_EFR_REG(EXTMFP2, 0x03, 0x02);} while (0)
#define  _P20_IO_RX1()                             do {_P20_IO_PULLUP(SET); MODIFY_EFR_REG(EXTMFP2, 0x03, 0x03);} while (0)
#define  _P21_IO_TX1()                             do {_P21_IO_PULLUP(SET); MODIFY_EFR_REG(EXTMFP2, 0x0C, 0x08);} while (0)
#define  _P22_IO_RX1()                             do {_P22_IO_PULLUP(SET); MODIFY_EFR_REG(EXTMFP2, 0x30, 0x20);} while (0)

#define  _P27_IO_TX0()                             do {_P27_IO_PULLUP(SET); MODIFY_EFR_REG(EXTMFP4, 0x07, 0x06);} while (0)
#define  _P27_IO_RX0()                             do {_P27_IO_PULLUP(SET); MODIFY_EFR_REG(EXTMFP4, 0x07, 0x05);} while (0)
#define  _P27_IO_TX1()                             do {_P27_IO_PULLUP(SET); MODIFY_EFR_REG(EXTMFP4, 0x07, 0x02);} while (0)
#define  _P27_IO_RX1()                             do {_P27_IO_PULLUP(SET); MODIFY_EFR_REG(EXTMFP4, 0x07, 0x01);} while (0)

#define  _P30_IO_TX1()                             do {_P30_IO_PULLUP(SET); MODIFY_EFR_REG(EXTMFP4, 0x38, 0x08);} while (0)
#define  _P30_IO_RX1()                             do {_P30_IO_PULLUP(SET); MODIFY_EFR_REG(EXTMFP4, 0x38, 0x10);} while (0)
#define  _P30_IO_TX0()                             do {_P30_IO_PULLUP(SET); MODIFY_EFR_REG(EXTMFP4, 0x38, 0x28);} while (0)
#endif

/*****************   change to ADC mode   ***/
#define  _P01_IO_AN3()                             MODIFY_REG(MFP0, 0x0C, 0x04)
#define  _P02_IO_AN7()                             do {MODIFY_REG(MFP0, 0x30, 0x20); MODIFY_EFR_REG(EXTMFP6, 0x06, 0x02);} while (0)
#define  _P03_IO_AN2()                             MODIFY_REG(MFP0, 0xC0, 0xC0)
#define  _P06_IO_AN4()                             MODIFY_REG(MFP1, 0x30, 0x30)
#if (CONFIG_IC_TYPE == CHIP_SS888X)
#define  _P11_IO_AN5()                             do {MODIFY_REG(MFP2, 0x0C, 0x0C); MODIFY_EFR_REG(EXTMFP6, 0x19, 0x01);} while (0)
#define  _P16_IO_AN5()                             MODIFY_EFR_REG(EXTMFP6, 0x19, 0x10)
#define  _P25_IO_AN7()                             MODIFY_EFR_REG(EXTMFP6, 0x06, 0x04)
#define  _P26_IO_AN5()                             MODIFY_EFR_REG(EXTMFP6, 0x19, 0x08)
#else
#define  _P11_IO_AN5()                             MODIFY_REG(MFP2, 0x0C, 0x0C)
#endif

/*****************   change to EINT mode   ***/
#define  _P03_IO_EINT1()                           MODIFY_REG(MFP0, 0xC0, 0x80)
#define  _P04_IO_EINT0()                           MODIFY_REG(MFP1, 0x03, 0x02)
#define  _P10_IO_EINT0()                           MODIFY_REG(MFP2, 0x03, 0x02)
#define  _P14_IO_EINT1()                           MODIFY_REG(MFP3, 0x30, 0x30)

/*****************   change to RESET(low active) mode   ***/
#define  _P03_IO_RESET()                           MODIFY_REG(MFP0, 0xC0, 0x40)

/*****************   change to PFO mode   ***/
#define  _P07_IO_PFO()                             MODIFY_REG(MFP1, 0xC0, 0x80)

/*****************   INIT  interrupt    ***/
/* INTEN0 */
#define  _EA_INTERRUPT(en)                         WRITE_REG(EA, en)
#define  _ECHG_INTERRUPT(en)                       WRITE_REG(ECHG, en)
#define  _ECMP_INTERRUPT(en)                       WRITE_REG(ECMP, en)
#define  _ELV_INTERRUPT(en)                        WRITE_REG(ELV, en)
#define  _EOT_INTERRUPT(en)                        WRITE_REG(EOT, en)
#define  _EIIC0_INTERRUPT(en)                      WRITE_REG(EIIC, en)
#define  _EUART0_INTERRUPT(en)                     WRITE_REG(EUART, en)
/* INTEN1 */
#define  _ESDP_INTERRUPT(en)                       WRITE_REG(ESDP, en)
#define  _TIMER0_INTERRUPT(en)                     WRITE_REG(ET0, en)
#define  _TIMER1_INTERRUPT(en)                     WRITE_REG(ET1, en)
#define  _TIMER2_INTERRUPT(en)                     WRITE_REG(ET2, en)
#define  _TIMER2_CAPTURE0_INTERRUPT(en)            WRITE_REG(ET2C0, en)
#define  _TIMER2_CAPTURE1_INTERRUPT(en)            WRITE_REG(ET2C1, en)
#define  _TIMER2_CAPTURE2_INTERRUPT(en)            WRITE_REG(ET2C2, en)
#define  _TIMER2_CAPTURE3_INTERRUPT(en)            WRITE_REG(ET2C3, en)
/* INTEN2 */
#define  _SYS_TIMER_INTERRUPT(en)                  WRITE_REG(ETICK, en)
#define  _EOC_INTERRUPT(en)                        WRITE_REG(EOC, en)
#define  _EOV_INTERRUPT(en)                        WRITE_REG(EOV, en)
#define  _EADC_INTERRUPT(en)                       WRITE_REG(EADC, en)
#define  _EX0_INTERRUPT(en)                        WRITE_REG(EX0, en)
#define  _EX1_INTERRUPT(en)                        WRITE_REG(EX1, en)
/* INTEN3 */
#if (CONFIG_IC_TYPE == CHIP_SS888X)
#define  _EUART1_INTERRUPT(en)                     MODIFY_REG(INTEN3, EUART1_BIT, en<<0)
#define  _EIIC1_INTERRUPT(en)                      MODIFY_REG(INTEN3, EIIC1_BIT, en<<1)
#define  _ESPI_INTERRUPT(en)                       MODIFY_REG(INTEN3, ESPI_BIT, en<<2)
#define  _ESSP_INTERRUPT(en)                       MODIFY_REG(INTEN3, ESSP_BIT, en<<3)
#endif

void drive_init(void);

#endif